﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace AP_Data
{
	/// <summary>
	/// Summary description for BusinessDay
	/// </summary>
	public class BusinessDay
	{
		public BusinessDay()
		{
		}

		/// <summary>
		/// Retorna uma lista com os últimos dias úteis.
		/// </summary>
		/// <param name="date">Data base</param>
		/// <param name="numDays">Quantidade de dias a ser retornado na lista</param>
		/// <returns>Lista com as últimas datas válidas</returns>
		public List<DateTime> GetLastBusinessDays( DateTime date, int numDays )
		{
			List<DateTime> listLastBusinessDays = new List<DateTime>();
			DateTime currentDate = date;

			//Enquanto a lista não tiver o total de dias, adiciona os dias úteis.
			while( listLastBusinessDays.Count != numDays )
			{
				//Data corrente, recebe o dia anterior
				currentDate = currentDate.AddDays( -1 );

				//Se a data for feriado ou não for dia útil, ignora e passa para a próxima data
				if( isHoliday( currentDate ) || isNotBusinessDay( currentDate ) )
					continue;
				else
					//Se for dia útil, adiciona na lista
					listLastBusinessDays.Add( currentDate );
			}

			return listLastBusinessDays;
		}

		/// <summary>
		/// Verifica se a data é um feriado
		/// </summary>
		/// <param name="date"></param>
		/// <returns>True se a data for feriado</returns>
		private bool isHoliday( DateTime date )
		{
			List<DateTime> listHolidays = getListHolidays();
			return listHolidays.Contains( date );
		}

		/// <summary>
		/// Recupera a lista de feriados cadastrados
		/// </summary>
		/// <returns>Lista com todas as datas de feriado</returns>
		private List<DateTime> getListHolidays()
		{
			List<DateTime> listHolidays = new List<DateTime>();

			listHolidays.Add( new DateTime( 2012, 01, 01 ) ); // 01/01/2012
			listHolidays.Add( new DateTime( 2012, 02, 21 ) ); // 21/02/2012
			listHolidays.Add( new DateTime( 2012, 12, 25 ) ); // 25/12/2012
			listHolidays.Add( new DateTime( 2012, 12, 31 ) ); // 31/12/2012

			return listHolidays;
		}

		/// <summary>
		/// Verifica se a data recebida é um dia não útil.
		/// </summary>
		/// <param name="date"></param>
		/// <returns>True - Dia não útil.</returns>
		private bool isNotBusinessDay( DateTime date )
		{
			bool result = true;

			switch( date.DayOfWeek )
			{
				case DayOfWeek.Friday:
				case DayOfWeek.Monday:
				case DayOfWeek.Thursday:
				case DayOfWeek.Tuesday:
				case DayOfWeek.Wednesday:
				result = false;
				break;
				case DayOfWeek.Saturday:
				case DayOfWeek.Sunday:
				result = true;
				break;
			}

			return result;
		}
	}
}
